﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Web.Mvc;
using IndignadoFramework.BackBone.InternalServices;
using IndignadoFramework.BackBone.InternalServices.Implementacion;
using IndignadoFramework.BackBone.Model;
using IndignadoFramework.FrontOffice.Models;
using IndignadoFramework.BackBone.DTO;

namespace IndignadoFramework.FrontOffice.Controllers
{
    public class ContenidoController : SiteController
    {
        private ContenidoUsuarioServices _contenidos;
        
        public ContenidoController()
            : this(new ContenidoUsuarioServicesImpl())
        {
        }

        public ContenidoController(ContenidoUsuarioServices contenidos)
        {
            _contenidos = contenidos;
            
        }

        //
        // GET: /ContenidoUsuario/Agregar

        public ActionResult Agregar()
        {
            return PartialView();
        } 

        //
        // POST: /ContenidoUsuario/Agregar

        [Authorize]
        [HttpPost]
        public ActionResult Agregar(ContenidoUploadModel model)
        {
            if (ModelState.IsValid)
            {
                if (model.Tipo.Equals(IndignadoFramework.FrontOffice.Models.ContenidoUploadModel.TipoArchivo.Video)){
                    string mimeType = Request.Files["ContenidoUploadArchivo"].ContentType;
                    Stream fileStream = Request.Files["ContenidoUploadArchivo"].InputStream;
                    string fileName = Path.GetFileName(Request.Files["ContenidoUploadArchivo"].FileName);
                    int fileLength = Request.Files["ContenidoUploadArchivo"].ContentLength;
                    byte[] file = new byte[fileLength];
                    fileStream.Read(file, 0, fileLength);

                    VideoModel cont = new VideoModel();
                    cont.VideoData = file;
                    cont.VideoFormato = mimeType;
                    cont.ContenidoDadoBaja = false;
                    cont.ContenidoFechaCreacion = DateTime.Now;
                    cont.VideoHeight = "270";
                    cont.VideoWidth = "480";
                    cont.UsuarioId = Int32.Parse(User.Identity.Name);
                    cont.MovimientoId = Site.Id;

                    _contenidos.addContenidoVideoUsuario(cont);
                }
                else {
                    if (model.Tipo.Equals(IndignadoFramework.FrontOffice.Models.ContenidoUploadModel.TipoArchivo.Imagen))
                    {
                        string mimeType = Request.Files["ContenidoUploadArchivo"].ContentType;
                        Stream fileStream = Request.Files["ContenidoUploadArchivo"].InputStream;
                        string fileName = Path.GetFileName(Request.Files["ContenidoUploadArchivo"].FileName);
                        int fileLength = Request.Files["ContenidoUploadArchivo"].ContentLength;
                        byte[] file = new byte[fileLength];
                        fileStream.Read(file, 0, fileLength);

                        ImagenModel cont = new ImagenModel();
                        cont.ImagenData = file;
                        cont.ImagenFormato = mimeType;
                        cont.ContenidoDadoBaja = false;
                        cont.ContenidoFechaCreacion = DateTime.Now;
                        cont.ImagenHeight = "240";
                        cont.ImagenWidth = "426";
                        cont.UsuarioId = Int32.Parse(User.Identity.Name);
                        cont.MovimientoId = Site.Id;

                        _contenidos.addContenidoImagenUsuario(cont);
                    }
                    else
                    {
                        LinkModel cont = new LinkModel();
                        cont.LinkUrl = model.URL;
                        cont.ContenidoDadoBaja = false;
                        cont.LinkComentario = model.Comentario;
                        cont.ContenidoFechaCreacion = DateTime.Now;
                        cont.UsuarioId = Int32.Parse(User.Identity.Name);
                        cont.MovimientoId = Site.Id;

                        _contenidos.addContenidoLinkUsuario(cont);
                    }
                }
            }
            return RedirectToAction("Index", "Home");
        }


        //
        // GET: /ContenidoUsuario/Listar

        public PartialViewResult Listar(int? pagina, string filtro)
        {
            ContenidoListarModel model = new ContenidoListarModel();

            IEnumerable<ContenidoModelDTO> contenido;
            // Contenido del Movimiento
            if (filtro == null || filtro.Equals("F"))
            {
                contenido = _contenidos.getContenidosByDate(Site.Id, pagina);
                model.PaginaSiguiente = _contenidos.existPaginaSiguienteByDate(Site.Id, pagina);
            }
            else
            {
                contenido = _contenidos.getContenidosByRanking(Site.Id, pagina);
                model.PaginaSiguiente = _contenidos.existPaginaSiguienteByRanking(Site.Id, pagina);
            }
            model.Contenidos = contenido;

            if (pagina.HasValue)
            {
                model.PaginaActual = pagina.Value;
            }
            else
            {
                model.PaginaActual = 0;
            }
            ViewBag.Filtro = filtro;

            return PartialView(model);
        }

        [Authorize]
        [HttpPost]
        public ActionResult MeGusta(MarcaModel model)
        {
            int cantMeGusta = 0;
            if (ModelState.IsValid)
            {
                model.MovimientoId = Site.Id;
                cantMeGusta = _contenidos.tagMeGusta(model);
            }
            return Json(new { cant = cantMeGusta, id = model.ContenidoId }, JsonRequestBehavior.AllowGet);
        }

        [Authorize]
        [HttpPost]
        public ActionResult Inadecuado(MarcaModel model)
        {
            int cantInadecuado = 0;
            if (ModelState.IsValid)
            {
                model.MovimientoId = Site.Id;
                cantInadecuado = _contenidos.tagInadecuado(model);
            }
            return Json(new { cant = cantInadecuado, id = model.ContenidoId }, JsonRequestBehavior.AllowGet);
        }
    }
}
